package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomFlag;
import br.com.telescope.adsrt.dom.DomId;
import br.com.telescope.adsrt.dom.DomLogin;
import br.com.telescope.adsrt.dom.DomPasswordHash;
import br.com.telescope.adsrt.dom.DomText;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.adsrt.lib.Field;
import br.com.telescope.t2.AccessPolicy;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.exception.ApplicationRuntimeException;
import br.com.telescope.t2.feature.CustomFeature;
import br.com.telescope.t2.feature.MethodFeature;
import java.util.ArrayList;
import java.util.List;
import solutions.ferpa.ztest.ent.*;

/**
 * Alteração de senha.
 * <p>
 * Abre uma tela para o usuário alterar a senha atual por outra. Pede a 
 * senha atual e duas vezes a nova senha.
 * <P>
 * Quando esta tela for chamada a partir da recuperação de senha, o campo 
 * "Senha atual" é omitido e o usuário não precisar informa-la.
 * <P>
 * 
 * <P>
 * Telescope origin: RTAUTH.ALT_SENHA
 * <P>
 * Base entity: RTAUTH.USUARIOS
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class AltSenha extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "RTAUTH.ALT_SENHA";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Alteração de senha");
    }
    
    protected EntUsuarios usua;
    protected EntUsuarios rec; // NEED_TJW1_COMPATIBILITY
    
    // Service parameters
    private DomText pHash;
    
    // Record items
    private DomLogin aLogin;
    private DomPasswordHash aSenhaHash;
    private DomFlag aAtivo;
    private DomId aId;
    private DomFlag aSuperUsuario;
    private DomPasswordHash aNovaSenha1;
    private DomPasswordHash aNovaSenha2;
    
    // Query items
    
    @Override
    public String getBaseSql() {
        return "select USUA.*"
                + " from USUARIOS USUA";
    }
    
    @Override
    public String getBaseSqlWhereClause() {
        
        return " where usua.id = "
        + ctx.getSessionString("USUA_ID") + "";
    }
    
    @Override
    public void initAttributes() {
        
        aLogin = new DomLogin();
        aLogin.context(ctx).name("LOGIN").label("Login");
        
        aSenhaHash = new DomPasswordHash();
        aSenhaHash.context(ctx).name("SENHA_HASH").label("Senha").width(12);
        
        aAtivo = new DomFlag();
        aAtivo.context(ctx).name("ATIVO").label("Ativo");
        aAtivo.setDefaultValue("S");
        
        aId = new DomId();
        aId.context(ctx).name("ID").label("ID");
        
        aSuperUsuario = new DomFlag();
        aSuperUsuario.context(ctx).name("SUPER_USUARIO").label("Super usuário");
        aSuperUsuario.setDefaultValue("N");
        
        aNovaSenha1 = new DomPasswordHash();
        aNovaSenha1.context(ctx).name("NOVA_SENHA_1").label("Nova senha").width(12).unbound(true);
        
        aNovaSenha2 = new DomPasswordHash();
        aNovaSenha2.context(ctx).name("NOVA_SENHA_2").label("Repetir nova senha").width(12).unbound(true);
        
    }
    
    @Override
    public void initParameters() {
        pHash = new DomText(ctx, "HASH", "HASH");
        pHash.setValue(ctx.getParameter("P_HASH"));
        pHash.setUnbound(true);
    }
    
    @Override
    public List<Field> getParameters() {
        if (allParameters == null) {
            allParameters = new ArrayList<Field>();
            allParameters.add(pHash);
        }
        return allParameters;
    }
    
    @Override
    public String getQueryPkColumn() {
        return "USUA.ID";
    }
    
    @Override
    public void setId(String value) {
        this.aId.setValue(value);
    }
    
    @Override
    public EntUsuarios getRecord() {
        if (usua == null) {
            usua = new EntUsuarios(ctx);
            rec = usua;
        }
        return this.usua;
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="CUSTOM">
    public class FCustom extends CustomFeature {
        
        @Override
        public void initForm() {
            aLogin.setEditable(false);
            addField(aLogin, "view");
            aSenhaHash.setLabel("Senha atual");
            aSenhaHash.setOptional(false);
            addField(aSenhaHash, "rqd");
            aNovaSenha1.setOptional(false);
            addField(aNovaSenha1, "rqd");
            aNovaSenha2.setOptional(false);
            addField(aNovaSenha2, "rqd");
        }
        
        @Override
        public int getAccessPolicy() {
            return AccessPolicy.USER;
        }
        
        @Override
        public void preDisplay() {
            try {
                buscarUsuarioSessao();
                verificarTipoAlteracao();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        @Override
        public void onAction() {
            addSubmit(getFeature("ALTERAR_SENHA")).label("Alterar senha").icon("salvar.gif");
        }
        
        {
            setFeatureName("CUSTOM");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="RESULTADO">
    public class FResultado extends CustomFeature {
        
        @Override
        public void initForm() {
            aLogin.setEditable(false);
            addField(aLogin, "view");
        }
        
        @Override
        public int getAccessPolicy() {
            return AccessPolicy.USER;
        }
        
        {
            setFeatureName("RESULTADO");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="ALTERAR_SENHA">
    public class FAlterarSenha extends MethodFeature {
        
        @Override
        public void run() {
            preRun();
            try {
                alterarSenha();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("ALTERAR_SENHA");
            setTitle("Alterar senha");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FCustom());
        addFeature(new FResultado());
        addFeature(new FAlterarSenha());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "CUSTOM";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    public String getLogin() {
        return aLogin.getValue();
    }
    
    public void setLogin(String value) {
        this.aLogin.setValue(value);
    }
    
    public String getSenhaHash() {
        return aSenhaHash.getValue();
    }
    
    public void setSenhaHash(String value) {
        this.aSenhaHash.setValue(value);
    }
    
    public String getAtivo() {
        return aAtivo.getValue();
    }
    
    public void setAtivo(String value) {
        this.aAtivo.setValue(value);
    }
    
    @Override
    public Long getId() {
        return aId.getValue();
    }
    
    public void setId(Long value) {
        this.aId.setValue(value);
    }
    
    public String getSuperUsuario() {
        return aSuperUsuario.getValue();
    }
    
    public void setSuperUsuario(String value) {
        this.aSuperUsuario.setValue(value);
    }
    
    public String getNovaSenha1() {
        return aNovaSenha1.getValue();
    }
    
    public void setNovaSenha1(String value) {
        this.aNovaSenha1.setValue(value);
    }
    
    public String getNovaSenha2() {
        return aNovaSenha2.getValue();
    }
    
    public void setNovaSenha2(String value) {
        this.aNovaSenha2.setValue(value);
    }
    
    public String getParameterHash() {
        return pHash.getValue();
    }
    
    public void setParameterHash(String value) {
        pHash.setValue(value);
    }
    // </editor-fold>
    
    /**
     * Alterar senha.
     * <p>
     * Verifica se a senha atual está correta e se as duas senhas digitadas 
     * são iguais.
     * <P>
     * Se tudo estiver certo, altera as senha.
     * <P>
     */
    private void alterarSenha() throws AdsException {
        // <user-code id="795609" parentId="752536" hashcode="4a5b9fe3" length="962">
        EntUsuarios usuario = new EntUsuarios(ctx);
        usuario.find(ctx.getUserId());
        
        String senhaAntiga = ctx.getParameter("A_SENHA_HASH");
        String novaSenha1 = ctx.getParameter("A_NOVA_SENHA_1");
        String novaSenha2 = ctx.getParameter("A_NOVA_SENHA_2");        
        
        if (!ctx.getParameter("P_HASH").isEmpty()) {
            senhaAntiga = usuario.valueOfSenhaHash();
        }
        
        if (usuario.valueOfSenhaHash().equals(senhaAntiga)) {
            if (novaSenha1.equals(novaSenha2)) {
                usuario.setSenhaHash(novaSenha1);
                usuario.save();
                ctx.showSuccess("Senha alterada com sucesso!");
            } else {
                ctx.pushError(globalName() + ".INVALID_NEW_PASSWORDS", AdsException.ERROR, "As senhas informadas devem ser iguais!");
                gotoFeature(getFeature("CUSTOM"), rec);
            }
        } else {
            ctx.pushError(globalName() + ".INVALID_OLD_PASSWORD", AdsException.ERROR, "Senha informada não combina com a senha atual!");
            gotoFeature(getFeature("CUSTOM"), rec);
        }
        // </user-code>
    }
    
    /**
     * Buscar os dados do usuário da sessão.
     * <p>
     * Buscar os dados do usuário da sessão para apresentar na tela.
     * <P>
     */
    private void buscarUsuarioSessao() throws AdsException {
        // <user-code id="795612" parentId="752539" hashcode="-351e41c3" length="66">
        aLogin.setValue(ctx.getSession().getCurrentUser().getLoginName());
        // </user-code>
    }
    
    /**
     * Verificar tipo de alteração.
     * <p>
     * Verifica se existe um paramentro na url chamado hash, caso exista ele 
     * assume outro comportamento para a alteração de senha
     */
    private void verificarTipoAlteracao() throws AdsException {
        // <user-code id="795565" parentId="795561" hashcode="6c573151" length="98">
        if (!ctx.getParameter("P_HASH").isEmpty()) {
            getForm().get("SENHA_HASH").setHidden(true);
        }
        
        // </user-code>
    }
}
